package net.jjjshop.common.util.buer;

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

/**
 * @description: 布尔风控接口
 * @author: dingli
 * @create: 2024-07-04 11:16
 **/
@Slf4j

public class BuerUtil {
    /**
     * 身份证ORC识别
     *
     * @param idImagesUrl 图片URL
     * @return
     */
    public static Map<String, Object> idOCR(String idImagesUrl) {
        try {
            Map<String, Object> customData = new TreeMap<>();

            // 测试环境公司id 正式环境需要更换正式，对接时业务人员发送的参数文档里找
            String companyId = BuerConfig.companyId;
            // 测试环境请求地址 正式环境需要更换正式，对接时业务人员发送的参数文档里找
            String url = BuerConfig.url;
            // 测试环境密钥 正式环境需要更换 对接时业务人员发送的参数文档里找
            String key = BuerConfig.key;

            // 请求参数（根据文档填值），参数不固定有多少，具体请求参数和说明在对接文档里有说明
            // 请替换成真实参数
            customData.put("imageBase64", "");
            customData.put("imageOssUrl", idImagesUrl);
            customData.put("service", "ident_number_ocr_service");
            customData.put("mode", "mode_ident_number_ocr");
            // 上述参数都是需要更换的参数，根据自己的需要参考文档更换

            String bizDataRaw = JSONObject.toJSON(customData).toString();
            System.out.println(bizDataRaw);
            // AES加密
            System.out.println("AES 加密模型是：");
            //加密得到的加密串
            String bizDataEncoded = AES.encrypt(bizDataRaw, key);
            System.out.println(bizDataEncoded);
            System.out.println("原始数据是：");
            System.out.println(AES.decrypt(AES.encrypt(bizDataRaw, key), key));

            // 请求接口
            Map<String, Object> data = new HashMap<>();
            // 公司id
            data.put("institution_id", companyId);
            // biz_data参数使用AES加密后得到的加密串
            data.put("biz_data", bizDataEncoded);
            System.out.println(data);
            // 发送请求
            String result = HttpUtil.invokePostWithMap(url, data);
            System.out.println("返回结果为：" + result);
            //{"resp_code":"SW0000","resp_msg":"查询成功","timestamp":1720063238661,"resp_order":"lgt17200632383343","resp_data":{"validity":{"birthday":false,"number":true,"address":true,"sex":false,"name":true},"info":{"number":"140105200003076241","address":"湖北省黄冈市黄州区赤壁区","month":"4","nation":"汉","year":"1987","sex":"男","name":"朱锦成","day":"7"}}}
            JSONObject resultJson = JSONObject.parseObject(result);
            if (resultJson.getString("resp_code").equals("SW0000")) {
                Map<String, Object> dataMap = new HashMap<>();
                dataMap.put("idNumber", resultJson.getJSONObject("resp_data").getJSONObject("info").getString("number"));
                dataMap.put("name", resultJson.getJSONObject("resp_data").getJSONObject("info").getString("name"));
                return dataMap;
            }
        } catch (Exception e) {
            System.out.println(e);
        }
        return null;
    }

    /**
     * 三要素认证
     *
     * @param name     姓名
     * @param idNumber 身份证号
     * @param phone    手机号
     */
    public static Boolean sanyaoshu(String name, String idNumber, String phone) {
        try {
            Map<String, Object> customData = new TreeMap<>();
            // 测试环境公司id 正式环境需要更换正式，对接时业务人员发送的参数文档里找
            String companyId = BuerConfig.companyId;
            // 测试环境请求地址 正式环境需要更换正式，对接时业务人员发送的参数文档里找
            String url = BuerConfig.url;
            // 测试环境密钥 正式环境需要更换 对接时业务人员发送的参数文档里找
            String key = BuerConfig.key;


            // 请求参数（根据文档填值），参数不固定有多少，具体请求参数和说明在对接文档里有说明
            // 请替换成真实参数
            customData.put("name", name);
            customData.put("ident_number", idNumber);
            customData.put("phone", phone);
            //授权书
            String licenseUrl = OssService.generateImage(name);
            customData.put("licenseUrl", licenseUrl);
            customData.put("service", "network_operator_triple_elements");
            customData.put("mode", "mode_triple_elements");
            customData.put("licenseType", "0");
            // 上述参数都是需要更换的参数，根据自己的需要参考文档更换

            String bizDataRaw = JSONObject.toJSON(customData).toString();
            System.out.println(bizDataRaw);
            // AES加密
            System.out.println("AES 加密模型是：");
            //加密得到的加密串
            String bizDataEncoded = AES.encrypt(bizDataRaw, key);
            System.out.println(bizDataEncoded);
            System.out.println("原始数据是：");
            System.out.println(AES.decrypt(AES.encrypt(bizDataRaw, key), key));

            // 请求接口
            Map<String, Object> data = new HashMap<>();
            // 公司id
            data.put("institution_id", companyId);
            // biz_data参数使用AES加密后得到的加密串
            data.put("biz_data", bizDataEncoded);
            System.out.println(data);
            // 发送请求
            String result = HttpUtil.invokePostWithMap(url, data);
            System.out.println("返回结果为：" + result);
            JSONObject resultJson = JSONObject.parseObject(result);
            if (resultJson.getString("resp_code").equals("SW0000")) {
                String code = resultJson.getJSONObject("resp_data").getJSONObject("resp_data").getString("result_code");
                if (code.equals("02")) {
                    return true;
                } else {
                    return false;
                }
            }
        } catch (Exception e) {
            System.out.println(e);
        }
        return false;
    }

    /**
     *
     * @param name     姓名
     * @param idNumber 身份证号
     * @param phone    手机号
     * @return 报告URL
     */
    public static JSONObject rickReport(String name, String idNumber, String phone) {
        try{
            Map<String, Object> customData = new TreeMap<>();

            // 测试环境公司id 正式环境需要更换正式，对接时业务人员发送的参数文档里找
            String companyId = BuerConfig.companyId;
            // 测试环境请求地址 正式环境需要更换正式，对接时业务人员发送的参数文档里找
            String url = BuerConfig.url;
            // 测试环境密钥 正式环境需要更换 对接时业务人员发送的参数文档里找
            String key = BuerConfig.key;

            // 请求参数（根据文档填值），参数不固定有多少，具体请求参数和说明在对接文档里有说明
            // 请替换成真实参数
            customData.put("name", name);
            customData.put("ident_number", idNumber);
            customData.put("phone", phone);
            //授权书
            String licenseUrl = OssService.generateImage(name);
            log.info("licenseUrl:{}",licenseUrl);
            customData.put("licenseUrl", licenseUrl);
            customData.put("licenseType", 0);

            // 非必传参数，根据业务情况传
//            customData.put("goods_type", 1);
//            customData.put("status", 0);
//            customData.put("total_rent", 130.20);
//            customData.put("total_periods", 2);
//            customData.put("price", 1200.00);
            customData.put("type", 0);
            customData.put("service", "risk_report_service");
            customData.put("mode", "mode_xyb_report_ways");
            // 上述参数都是需要更换的参数，根据自己的需要参考文档更换


            String bizDataRaw = JSONObject.toJSON(customData).toString();
            log.info(bizDataRaw);
            // AES加密
            System.out.println("AES 加密模型是：");
            //加密得到的加密串
            String bizDataEncoded = AES.encrypt(bizDataRaw, key);
            log.info(bizDataEncoded);
            log.info("原始数据是：");
            log.info(AES.decrypt(AES.encrypt(bizDataRaw, key), key));

            // 请求接口
            Map<String, Object> data = new HashMap<>();
            // 公司id
            data.put("institution_id", companyId);
            // biz_data参数使用AES加密后得到的加密串
            data.put("biz_data", bizDataEncoded);
            log.info("请求数据:{}",data);
            // 发送请求
            String result = HttpUtil.invokePostWithMap(url, data);
            log.info("返回结果为：" + result);
            JSONObject resultJson = JSONObject.parseObject(result);
            if (resultJson.getString("resp_code").equals("SW0000")) {
//                return resultJson.getJSONObject("resp_data").getString("url");
                return resultJson;
            }
        }catch (Exception e){
            e.printStackTrace();
            log.info(e.toString());
        }
        return null;
    }


    /**
     *人脸识别
     * @param name     姓名
     * @param idNumber 身份证号
     * @return
     */
    public static JSONObject kexinrenzheng(String name, String idNumber) {
        try{
            Map<String, Object> customData = new TreeMap<>();

            // 测试环境公司id 正式环境需要更换正式，对接时业务人员发送的参数文档里找
            String companyId = BuerConfig.companyId;
            // 测试环境请求地址 正式环境需要更换正式，对接时业务人员发送的参数文档里找
            String url = BuerConfig.url;
            // 测试环境密钥 正式环境需要更换 对接时业务人员发送的参数文档里找
            String key = BuerConfig.key;

            // 请求参数（根据文档填值），参数不固定有多少，具体请求参数和说明在对接文档里有说明
            // 请替换成真实参数
            customData.put("name", name);
            customData.put("ident_number", idNumber);
            customData.put("service", "trust_identity_auth_service");
            customData.put("mode", "mode_trust_identity_auth");
            //认证完成后重定向地址
            customData.put("redirectUrl", BuerConfig.kexinRedirectUrl);
            //认证结束后异步通知地址
            customData.put("notifyUrl", BuerConfig.kexinNotifyUrl);
            // 上述参数都是需要更换的参数，根据自己的需要参考文档更换


            String bizDataRaw = JSONObject.toJSON(customData).toString();
            System.out.println(bizDataRaw);
            // AES加密
            System.out.println("AES 加密模型是：");
            //加密得到的加密串
            String bizDataEncoded = AES.encrypt(bizDataRaw, key);
            System.out.println(bizDataEncoded);
            System.out.println("原始数据是：");
            System.out.println(AES.decrypt(AES.encrypt(bizDataRaw, key), key));

            // 请求接口
            Map<String, Object> data = new HashMap<>();
            // 公司id
            data.put("institution_id", companyId);
            // biz_data参数使用AES加密后得到的加密串
            data.put("biz_data", bizDataEncoded);
            System.out.println(data);
            // 发送请求
            String result = HttpUtil.invokePostWithMap(url, data);
            System.out.println("返回结果为：" + result);
            JSONObject resultJson = JSONObject.parseObject(result);
            if (resultJson.getString("resp_code").equals("SW0000")) {
                //{
                //	"resp_code": "SW0000",
                //	"resp_msg": "查询成功",
                //	"timestamp": 1711974910489,
                //	"resp_order": "lgt17119749094853",
                //	"resp_data": {
                //		"certifyId": "330xxxxxxx13478731",
                //		"certifyUrl": "https://smlt.xxxxxxx"
                //	}
                //}

                return resultJson.getJSONObject("resp_data");
            }
        }catch (Exception e){
            System.out.println(e);
        }
        return null;
    }

    public static void main(String[] args) {
//        kexinrenzheng("宋祥雄","429004199005021410");
        idOCR("http://ruixiangimg.oss-cn-hangzhou.aliyuncs.com/20240709200040124.JPEG");
    }
}
